<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>awaitTo技术</title>
  </head>
  <body>
    <script>
      // 1. await 如何拿到错误的结果
      //   let p = new Promise((resolve, reject) => {
      //     setTimeout(() => {
      //       //   resolve('成功了')
      //       reject('失败了')
      //     }, 2000)
      //   })
      //   // 中间人: 把成功/失败的结果直接return返回给下一个Promise的then (await正好只能接收then的结果)
      //   let newP = p
      //     .then(res => {
      //       console.log(res) // '成功了'
      //       return res
      //     })
      //     .catch(err => {
      //       console.error(err)
      //       return err // return的结果默认就是 Promise.resolve(999) - 相当于resolve(999)
      //     })

      //   // (1): 我要使用async + await 来取代 then()函数写法
      //   // await 只能接收后面Promise的then结果(固定)
      //   async function a() {
      //     const res = await newP
      //     console.log(res);
      //   }
      //   a()



      // 2. 如何解决await拿到的是成功还是失败的结果
      // 根据await得到的数组
      // 第一个位置如果有值证明Promise里的异步任务失败了返回了错误信息
      // 第二个位置有值证明Promise里的异步任务成功了, 返回了正确的数据
    //   let p = new Promise((resolve, reject) => {
    //     setTimeout(() => {
    //         // resolve('成功了')
    //       reject('失败了')
    //     }, 2000)
    //   })

    //   let newP = p
    //     .then(res => {
    //       return [null, res]
    //     })
    //     .catch(err => {
    //       return [err, null]
    //     })

    //   async function a() {
    //     const arr = await newP
    //     console.log(arr)
    //   }
    //   a()


      // 3. 封装to函数
      function to(promiseObj){
        let newP = promiseObj
        .then(res => {
          return [null, res]
        })
        .catch(err => {
          return [err, null]
        })

        return newP
      }

      let p = new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve('成功了')
          reject('失败了')
        }, 2000)
      }) // axios请求:默认返回的也是一个包含ajax请求的一个Promise对象

      
      async function a() {
        const arr = await to(p) // 相当于 await newP - 监测中间人Promise对象(未来会返回数组)
        console.log(arr)
      }
      a()

      // reject -> catch() -> return 传给await位置
    </script>
  </body>
</html>
